home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1994 / MacHack 1994.toast / MacHack™94 / Hacks / [√] May be freely distributed / Donald Brown / TSMHelper 2.0 / TSMHelper.a < prev    next >
Encoding:
Text File  |  1994-06-25  |  6.7 KB  |  279 lines  |  [TEXT/MPS ]

  1. ;----------------------------------------------------------------
  2. ;
  3. ;  TSMHelper.a
  4. ;    ©1993-94 CE Software - All Rights Reserved
  5. ;    Written by Donald Brown
  6. ;
  7. ;    A small utility to properly catch clicks over TSM windows.
  8. ;
  9. ;-----------------------------------------------------------------
  10.             BLANKS        ON
  11.             STRING        ASIS
  12.             PRINT    OFF
  13.             INCLUDE 'QuickEqu.a'
  14.             INCLUDE 'ToolEqu.a'
  15.             INCLUDE 'SysEqu.a'
  16.             INCLUDE 'Traps.a'
  17.             PRINT    ON
  18.  
  19. HelperStuff        main    export
  20.  
  21. ;
  22. ; Procedure Install; external;
  23. ;   installs the patches in system heap
  24. ;
  25. InitEntry    BRA    Install
  26.  
  27. StartofInit
  28.  
  29. ;
  30. ; MyGetNextEvent.  Calls our routines, also checks mousedowns where appropriate
  31. ;
  32. MyGetNextEvent
  33.         link    A6,#0
  34.         movem.l    A1-A4/D6-D7,-(SP)
  35.         move.l    8(A6),A4        ;temporarily keep pointer to event in A4
  36.         
  37.         move.w    14(A6),-(SP)
  38.         move.w    12(A6),-(SP)
  39.         move.l    8(A6),-(SP)
  40.         move.l    OldGetNextEvent,A1    ;call the real GetNextEvent
  41.         jsr    (A1)
  42.         move.w    (SP)+,14(A6)
  43.                 
  44. @DontChangeMe
  45.         lea    TheHandlers,A3        ;go through our list of handlers
  46.         moveq    #9,D7
  47. @HandlerLoop
  48.         tst.l    (A3)            ;is there a pointer to a windowpointer?
  49.         beq.s    @NextHandler
  50.         move.l    (A3),A0            ;is there a window there?
  51.         tst.l    (A0)
  52.         beq.s    @NextHandler
  53.         
  54.         move.w    (A4),D0            ;is it a mousedown?
  55.         cmp.w    #1,D0
  56.         bne.s    @CallHandler
  57.         clr.b    -(SP)            ;see if the point is in the structure region
  58.         move.l    (A0),A0
  59.         move.l    evtMouse(A4),-(SP)    ;pass the point passed to us
  60.         move.l    114(A0),-(SP)        ;pass the structure region (offset from Think Ref)
  61.         _PtInRgn
  62.         tst.b    (SP)+
  63.         beq.s    @NextHandler
  64. @Callhandler
  65.         clr.w    -(SP)
  66.         move.w    14(A6),-(SP)
  67.         move.l    A4,-(SP)
  68.         move.l    4(A3),A0        ;call this handler
  69.         jsr    (A0)            ;syntax is Function MyHandler(oldresult:integer; VAR theevent:eventrecord):integer;
  70.         move.w    (SP)+,14(A6)
  71. @NextHandler
  72.         adda.l    #8,A3            ;try next
  73.         dbra    D7,@HandlerLoop
  74.         
  75.         movem.l    (SP)+,A1-A4/D6-D7
  76.         unlk    A6
  77.         move.l    (SP)+,A0
  78.         adda.l    #6,SP
  79.         jmp        (A0)
  80. ;
  81. ; MyFindWindow.  If it's over one of our windows, make it a system click!
  82. ;
  83. MyFindWindow
  84.         link    A6,#0
  85.         movem.l    A1-A4/D6-D7,-(SP)
  86.         lea    TheHandlers,A3        ;go through our list of handlers
  87.         moveq    #9,D7
  88. @HandlerLoop
  89.         tst.l    (A3)            ;is there a pointer to a windowpointer?
  90.         beq.s    @NextHandler
  91.         move.l    (A3),A0            ;is there a window there?
  92.         tst.l    (A0)
  93.         beq.s    @NextHandler
  94.         
  95.         clr.b    -(SP)            ;see if the point is in the structure region
  96.         move.l    (A0),A0
  97.         move.l    12(A6),-(SP)        ;pass the point passed to us
  98.         move.l    114(A0),-(SP)        ;pass the structure region (offset from Think Ref)
  99.         _PtInRgn
  100.         tst.b    (SP)+
  101.         bne.s    @ItIsUs
  102. @NextHandler
  103.         adda.l    #8,A3            ;try next
  104.         dbra    D7,@HandlerLoop
  105.         
  106.         movem.l    (SP)+,A1-A4/D6-D7    ;call the real FindWindow
  107.         unlk    A6
  108.         move.l    OldFindWindow,A1    ;call the real FindWindow
  109.         jmp    (A1)
  110.                 
  111. @ItIsUs        lea    LastMouse,A0        ;save the point
  112.         move.l    12(A6),(A0)+
  113.         move.l    4(A3),(A0)+        ;and the handler address
  114.         
  115.         move.l    (A3),A0            ;Finally, return the proper window
  116.         move.l    8(A6),A1
  117.         move.l    (A0),(A1)
  118.         move.w    #2,16(SP)        ;Force "InSysWindow"
  119.         movem.l    (SP)+,A1-A4/D6-D7
  120.         unlk    A6
  121.         move.l    (SP)+,A0
  122.         adda.l    #8,SP
  123.         jmp    (A0)
  124. ;
  125. ; MySystemClick.  If it's what we forced to be a system click
  126. ;
  127. MySystemClick
  128.         link    A6,#0
  129.         movem.l    A1-A4/D6-D7,-(SP)
  130.         move.l    12(A6),A0        ;is it our last click?
  131.         move.l    evtMouse(A0),D0
  132.         cmp.l    LastMouse,D0
  133.         beq.s    @ItIsUs
  134.  
  135.         movem.l    (SP)+,A1-A4/D6-D7    ;call the real SystemClick
  136.         unlk    A6
  137.         move.l    OldSystemClick,A1    ;call the real SystemClick
  138.         jmp    (A1)
  139. @ItIsUs        
  140.         clr.w    -(SP)            ;call our old handler
  141.         clr.w    -(SP)            ;pass zero for old result
  142.         move.l    12(A6),-(SP)
  143.         move.l    LastHandler,A0        ;call this handler
  144.         jsr    (A0)            ;syntax is Function MyHandler(oldresult:integer; VAR theevent:eventrecord):integer;
  145.         move.w    (SP)+,D0
  146.  
  147.         movem.l    (SP)+,A1-A4/D6-D7
  148.         unlk    A6
  149.         move.l    (SP)+,A0
  150.         adda.l    #8,SP
  151.         jmp    (A0)
  152. ;
  153. ; Procedure InstallOne(VAR wp:WindowPtr; whereproc:procptr; DoInstall:integer);
  154. ;    DoInstall=0 for remove, non-zero to add
  155. ;
  156. InstallOne
  157.         link    A6,#0
  158.         movem.l    A3/D5-D7,-(SP)
  159.         tst.w    8(A6)            ;are we installing?
  160.         bne.s    @DoAdd
  161.         lea    TheHandlers,A3        ;go through our list of handlers
  162.         moveq    #9,D7
  163. @RemoveLoop
  164.         move.l    (A3),D0            ;see if this is our windowpointer
  165.         sub.l    14(A6),D0        ;(compare the windowpointers)
  166.         _StripAddress
  167.         tst.l    D0
  168.         bne.s    @NextRemove
  169.         clr.l    (A3)            ;got it, wipe it out, we're done!
  170.         clr.l    4(A3)
  171.         bra.s    @AllDone
  172. @NextRemove
  173.         adda.l    #8,A3            ;try next
  174.         dbra    D7,@RemoveLoop
  175.         bra.s    @AllDone
  176.  
  177. @DoAdd
  178.         lea    TheHandlers,A3        ;go through our list of handlers
  179.         moveq    #9,D7
  180. @AddLoop
  181.         tst.l    (A3)
  182.         bne.s    @NextAdd        ;is this an empty spot?
  183.         move.l    14(A6),(A3)        ;yup, copy us in
  184.         move.l    10(A6),4(A3)
  185.         bra.s    @AllDone
  186. @NextAdd
  187.         adda.l    #8,A3            ;try next
  188.         dbra    D7,@AddLoop
  189.  
  190. @AllDone        
  191.         movem.l    (SP)+,A3/D5-D7
  192.         unlk    a6
  193.         move.l    (SP)+,A0
  194.         adda.l    #10,SP
  195.         jmp    (A0)
  196. ;
  197. ; The routine Gestalt will call to tell where my install routines are
  198. ;
  199. ReturnRegister
  200.         link    A6,#0
  201.         move.l    8(A6),A0    ;return the proper response
  202.         lea    InstallOne,A1
  203.         move.l    A1,(A0)
  204.         clr.w    16(A6)
  205.         unlk    A6
  206.         move.l    (SP)+,A0
  207.         adda.l    #8,SP
  208.         jmp    (A0)
  209.  
  210. OldGetOSEvent    dc.L    0        ;address of real GetOSEvent
  211. OldGetNextEvent    dc.l    0        ;address of prior GetNextEvent
  212. OldFindWindow    dc.L    0        ;address of real FindWindow
  213. OldSystemClick    dc.l    0        ;address of prior SystemClick
  214. ;
  215. MyTempWindow    dc.l    0        ;just used to call FindServiceWindow
  216. ;
  217. TheHandlers    dcb.b    80,0        ;The registered TSM handlers
  218.                     ;    array[1..10] of Record wp:WindowHandle; proc:procptr end;
  219. LastMouse    dc.l    0        ;Location of last mouse found by findwindow
  220. LastHandler    dc.l    0        ;and handler for it
  221. ;
  222. Install        link    A6,#-128
  223.         movem.l    D0-D1/A0-A4,-(SP)
  224.         btst    #0,KeyMap+7    ;see if shift key's down
  225.         bne    @999        ;if so, don't install
  226. ;
  227. ; Check on our gestalt being there!
  228. ;
  229.         move.l    #'tsmH',D0    ;call gestalt with our connection
  230.         _Gestalt
  231.         tst.w    D0
  232.         beq    @999        ;if no error, we're already installed somewhere else
  233.         
  234.         move.W    #$170,D0        ;First, save old loc of GetNextEvent
  235.         _GetTrapAddress    ,NEWTOOL
  236.         LEA    OldGetNextEvent,A1
  237.         move.L    A0,(A1)
  238.         
  239.         move.W    #$1B3,D0        ;Next, save old loc of SystemClick
  240.         _GetTrapAddress    ,NEWTOOL
  241.         LEA    OldSystemClick,A1
  242.         move.L    A0,(A1)
  243.         
  244.         move.W    #$12C,D0        ;Next, save old loc of FindWindow
  245.         _GetTrapAddress    ,NEWTOOL
  246.         LEA    OldFindWindow,A1
  247.         move.L    A0,(A1)
  248.         
  249.         move.L    #Install-StartofInit,D0
  250.         _NewPtr    ,SYS        ;get a block in the system heap
  251.         move.L    A0,A4        ;save the pointer
  252.         move.L    A0,A1        ;copy stuff over
  253.         LEA    StartofInit,A0
  254.         move.L    #Install-StartofInit,D0
  255.         _BlockMove
  256.         
  257.         move.w    #$170,D0                ;patch GetNextEvent
  258.         LEA    MyGetNextEvent-StartofInit(A4),A0
  259.         _SetTrapAddress    ,NEWTOOL
  260.         
  261.         move.w    #$1B3,D0                ;patch SystemClick
  262.         LEA    MySystemClick-StartofInit(A4),A0
  263.         _SetTrapAddress    ,NEWTOOL
  264.         
  265.         move.w    #$12C,D0                ;patch FindWindow
  266.         LEA    MyFindWindow-StartofInit(A4),A0
  267.         _SetTrapAddress    ,NEWTOOL
  268.         
  269.         move.l    #'tsmH',D0            ;register us so others can find us
  270.         LEA    ReturnRegister-StartofInit(A4),A0
  271.         _NewGestalt
  272. @998        
  273.             
  274. @999        movem.l    (SP)+,D0-D1/A0-A4
  275.         unlk    A6
  276.         RTS
  277.  
  278.         end
  279.